package com.hzw.saas.api.user;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.user.bo.UserAccountBO;
import com.hzw.saas.api.user.bo.UserAccountProfileBO;
import com.hzw.saas.api.user.query.UserAccountAddQuery;
import com.hzw.saas.api.user.query.UserAccountGetQuery;
import com.hzw.saas.api.user.query.UserAccountUpdateQuery;
import com.hzw.saas.common.config.util.PageParam;
import com.hzw.saas.common.util.enums.AssertEnum;

import java.util.Collection;
import java.util.List;

/**
 * 用户账户服务接口
 *
 * @author zzl
 * @since 12/21/2020
 */
public interface IUserAccountService {

    /**
     * 用户是否存在
     *
     * @param userId 用户ID
     * @return true or false
     */
    boolean existAccount(String userId);

    /**
     * 断言用户存在
     *
     * @param userId 用户ID
     */
    void assertExist(String userId, AssertEnum assertEnum);

    /**
     * 用户是否存在
     *
     * @param query 用户唯一性属性，多字段查询逻辑运算符为 or
     * @return true or false
     */
    boolean existAccount(UserAccountGetQuery query);

    /**
     * 断言用户存在
     *
     * @param query 用户唯一性属性，多字段查询逻辑运算符为 or
     */
    void assertExist(UserAccountGetQuery query, AssertEnum assertEnum);

    /**
     * 用户是否存在(排除指定的userID)
     *
     * @param query          用户查询条件
     * @param excludedUserId 排除的userId
     * @return true or false
     */
    boolean existAccount(UserAccountGetQuery query, String excludedUserId);

    /**
     * 用户是否存在(排除指定的userID)
     *
     * @param query          用户查询条件
     * @param excludedUserId 排除的userId
     * @param assertEnum     断言结果
     */
    void assertExist(UserAccountGetQuery query, String excludedUserId, AssertEnum assertEnum);

    /**
     * 获取用户账户
     *
     * @param userId 用户ID
     * @return 用户账户信息
     */
    UserAccountBO getAccount(String userId);

    /**
     * 获取用户账户
     *
     * @param query 用户唯一性属性，多字段查询逻辑运算符为 and
     * @return 用户账户信息
     */
    UserAccountBO getAccount(UserAccountGetQuery query);

    /**
     * 根据用户ID列表获取用户账户列表
     *
     * @param userIds 用户ID列表
     * @return 用户账户列表
     */
    List<UserAccountBO> listAccounts(Collection<String> userIds);

    /**
     * 增加用户账户
     *
     * @param account2Add 待新增账户信息
     * @param addCustomer 是否添加客户信息
     * @return 新增账户信息，包含生成的userId
     */
    UserAccountBO addAccount(UserAccountAddQuery account2Add, boolean addCustomer);

    /**
     * 更新用户信息
     *
     * @param account2Update 用户信息，需包含userId
     */
    boolean updateAccount(UserAccountUpdateQuery account2Update, boolean updateCustomer);

    /**
     * 重置密码
     *
     * @param userId   用户ID
     * @param password 新密码
     * @return 重置结果, true 成功 false 无用户
     */
    boolean resetPassword(String userId, String password);

    /**
     * @param userId
     * @return
     */
    UserAccountBO deleteAccount(String userId);

    /**
     * 删除账户
     *
     * @param query 账户唯一性属性，多字段查询逻辑运算符为 and
     * @return 被删除的账户信息
     */
    UserAccountBO deleteAccount(UserAccountGetQuery query);

    /**
     * 根据条件分页获取账户列表
     *
     * @param pageParam 分页信息
     * @param query     查询条件
     * @return 分页查询账户列表
     */
    IPage<UserAccountBO> pageAccounts(PageParam pageParam, UserAccountBO query);

    /**
     * 根据用户名或手机号或邮箱查找没有加入指定群组ID的用户信息
     *
     * @param pageParam 分页信息
     * @param query     查询条件
     * @return 分页查询账户列表
     */
    IPage<UserAccountProfileBO> pageAccountsByGroup(PageParam pageParam, UserAccountBO query, List<String> groupIds);

    List<UserAccountBO> getUserAccounts(List<String> userIds);

    List<UserAccountBO> findUserInfoWithCondition(List<String> userIdS);

    UserAccountBO getAccountByPhone(String phoneNum);

    UserAccountBO getByEmail(String email);

//    /**
//     * 模糊检索用户信息
//     * @param userAccountSearchQuery
//     * @return
//     */
//    List<UserAccountBO> findUserAccount(UserAccountSearchQuery userAccountSearchQuery);

}
